#ifndef PARSER_H_
#define PARSER_H_

struct symbol{
  char lexture[16];
  char token[16];
  signed int value;
} ;

struct _stackvariable{
	string name;
	int offset;
};

extern std::vector<symbol> symboltable;
extern std::vector<int> lexemeArray;


bool next_token_is_in(vector<string>&);
bool next_next_token_is_in(vector<string>&);
bool next_next_next_token_is_in(vector<string>&);
void match(int, string);
void printf_niveau(int niveau, string str);
void error(void);
void emit();

// Non-terminal functions
void program(int niveau);
void variable_declaration_statement_list(int niveau);
void rest_variable_declaration_statement_list(int niveau);
void variable_declaration_statement(int niveau);
void variable_declaration(int niveau);
void type(int niveau);
void Q(int niveau);	
void function_declaration_list(int niveau);
void rest_function_declaration_list(int niveau);
void function_declaration(int niveau);
void result_type(int niveau);
void function_identifier(int niveau);
void formal_parameter_list(int niveau);
void variable_declaration_list(int niveau);
void rest_variable_declaration_list(int niveau);
void block(int niveau);
void statement_list(int niveau);
void rest_statement_list(int niveau);
void statement(int niveau);
void assignment_statement(int niveau);
void conditional_statement(int niveau);
void elsepart(int niveau);
void while_loop(int niveau);
void expression(int niveau);
void rest_expression(int niveau);
void logical_and_expression(int niveau);
void rest_logical_and_expression(int niveau);
void equality_expression(int niveau);
void rest_equality_expression(int niveau);
void relation_expression(int niveau);
void rest_relation_expression(int niveau);
void arithmetic_expression(int niveau);
void rest_arithmetic_expression(int niveau);
void term_expression(int niveau);
void rest_term_expression(int niveau);
void unary_expression(int niveau);
void factor(int niveau);
void function_call(int niveau);
void actual_parameter_list(int niveau);
void expression_list(int niveau);
void rest_expression_list(int niveau);
void variable(int niveau);
void simple_variable(int niveau);
void constant(int niveau);
void equality_operator(int niveau);
void relation_operator(int niveau);
void arithmetic_operator(int niveau);
void term_operator(int niveau);
void unary_operator(int niveau);


#endif /*PARSER_H_*/
